package net.ufrog.common.web;

import net.ufrog.common.Logger;
import net.ufrog.common.app.App;
import net.ufrog.common.web.app.WebApp;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 请求参数
 * 
 * @author ultrafrog
 * @version 1.0, 2014-02-19
 * @since 1.0
 */
public class RequestParam implements Serializable {

    private static final long serialVersionUID = -4001243809440784905L;

    /** 参数 */
    private Map<String, String[]> mParams;

    /** 文件 */
    private Map<String, RequestFile[]> mFiles;

    /** 构造函数 */
    private RequestParam() {
        mParams = new HashMap<>();
        mFiles = new HashMap<>();
    }

    /**
     * 构造函数
     *
     * @param request 请求
     */
    public RequestParam(HttpServletRequest request) {
        this();
        mParams.putAll(request.getParameterMap());
    }

    /**
     * 读取参数映射表
     *
     * @return 参数映射表
     */
    public Map<String, String[]> getParams() {
        return mParams;
    }

    /**
     * 读取单个参数
     *
     * @param key 键值
     * @return 参数
     */
    public String getValue(String key) {
        return mParams.containsKey(key) ? mParams.get(key)[0] : null;
    }

    /**
     * 读取参数数组
     *
     * @param key 键值
     * @return 参数数组
     */
    public String[] getValues(String key) {
        return mParams.containsKey(key) ? mParams.get(key) : null;
    }

    /**
     * 读取文件映射表
     *
     * @return 文件映射表
     */
    public Map<String, RequestFile[]> getFiles() {
        return mFiles;
    }

    /**
     * 读取单个文件
     *
     * @param key 键值
     * @return 文件
     */
    public RequestFile getFile(String key) {
        return mFiles.containsKey(key) ? mFiles.get(key)[0] : null;
    }

    /**
     * 读取文件数组
     *
     * @param key 键值
     * @return 文件数组
     */
    public RequestFile[] getFiles(String key) {
        return mFiles.containsKey(key) ? mFiles.get(key) : null;
    }

    /**
     * 获取当前请求参数
     *
     * @return 当前请求参数
     */
    public static RequestParam current() {
        return App.current(WebApp.class).getRequestParam();
    }

    /**
     * 读取单个参数
     *
     * @param key 键值
     * @return 参数
     */
    public static String value(String key) {
        return current().getValue(key);
    }

    /**
     * 读取参数数组
     *
     * @param key 键值
     * @return 参数数组
     */
    public static String[] values(String key) {
        return current().getValues(key);
    }

    /**
     * 读取单个文件
     *
     * @param key 键值
     * @return 文件
     */
    public static RequestFile file(String key) {
        return current().getFile(key);
    }

    /**
     * 读取文件数组
     *
     * @param key 键值
     * @return 文件数组
     */
    public static RequestFile[] files(String key) {
        return current().getFiles(key);
    }

    /** 打印<br>仅当开发调试使用 */
    public static void print() {
        Logger.debug("param map:");
        current().getParams().forEach((k, v) -> Logger.debug("%s - %s", k, Stream.of(v).collect(Collectors.joining("; "))));
        Logger.debug("file map:");
        current().getFiles().forEach((k, v) -> Logger.debug("%s - %s", k, Stream.of(v).map(file -> file.getOriginalFilename() + ":" + file.getSize()).collect(Collectors.joining("; "))));
    }
}
